/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.indicadores.dao;

import br.uniceub.fsw.arquitetura.persistencia.dao.BaseDAO;
import br.uniceub.fsw.arquitetura.persistencia.dao.ConstrutorSQL;
import br.uniceub.fsw.indicadores.vo.DadoPrimarioVO;
import br.uniceub.fsw.indicadores.vo.IndicadorVO;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * Data Access Object da entidade Dado Primario. Essa classe é responsável por todas as 
 * operações de banco de dados relacionadas à entidade.
 * 
 * @author Filipe Scafuto Vieira RA 20463917
 */
public class DadoPrimarioDAO extends BaseDAO<DadoPrimarioVO> {

    @Override
    public void inserir(DadoPrimarioVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("INSERT INTO TB_DadoPrimario(NO_DadoPrimario, DS_DadoPrimario, DS_UnidadeMedidaDadoPrimario, CD_Modulo, CD_Indicador)");
        query.append("VALUES (?, ?, ?, ?, ?)");

        List<?> parametros = criarParametros(entidade.getNoDadoPrimario(),
                entidade.getDsDadoPrimario(), entidade.getDsUnidadeMedidaDadoPrimario(),
                entidade.getCdModulo(), entidade.getCdIndicador());

        Integer idGerado = ((Long) executarInsercao(query.toString(), parametros)).intValue();

        entidade.setIdDadoPrimario(idGerado);
    }

    @Override
    public void alterar(DadoPrimarioVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("UPDATE TB_DadoPrimario SET NO_DadoPrimario = ?,");
        query.append("DS_DadoPrimario = ?,");
        query.append("DS_UnidadeMedidaDadoPrimario = ?,");
        query.append("CD_Modulo = ?,");
        query.append("CD_Indicador = ?");        
        query.append("WHERE ID_DadoPrimario = ?");

        List<?> parametros = criarParametros(entidade.getNoDadoPrimario(),
                entidade.getDsDadoPrimario(),entidade.getDsUnidadeMedidaDadoPrimario(),
                entidade.getCdModulo(),entidade.getCdIndicador(),
                entidade.getIdDadoPrimario());

        executarAlteracao(query.toString(), parametros);
    }

    @Override
    public void excluir(DadoPrimarioVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("DELETE FROM TB_DadoPrimario");
        query.append("WHERE ID_DadoPrimario = ?");

        executarAlteracao(query.toString(), criarParametros(entidade.getIdDadoPrimario()));
    }

    @Override
    public DadoPrimarioVO consultarPorId(Serializable id) {

        DadoPrimarioVO entidade = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_DadoPrimario T WHERE T.ID_DadoPrimario = ?");

        entidade = consultarUm(query.toString(), criarParametros(id));

        return entidade;
    }

    @Override
    public List<DadoPrimarioVO> consultarPorExemplo(DadoPrimarioVO exemplo) {

        List<DadoPrimarioVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_DadoPrimario T WHERE 1=1");

        mapearQueryParaExemplo(query, exemplo);

        listaRetorno = consultar(query.toString(), recuperarParametros());

        return listaRetorno;
    }
    
    /**
     * Retorna a lista de dados primários associados a dado indicador
     * 
     * @param indicador
     * @return
     */
    public List<DadoPrimarioVO> consultarPorIndicador(IndicadorVO indicador) {

        List<DadoPrimarioVO> listaRetorno = null;

        if(indicador != null) {
            ConstrutorSQL query = new ConstrutorSQL();

            query.append("" +
                    "SELECT " +
                    "   D.* " +
                    "FROM " +
                    "   TB_DadoPrimario D " +
                    "       INNER JOIN TB_Indicador I " +
                    "           ON I.ID_Indicador = D.CD_Indicador " +
                    "WHERE " +
                    "   I.ID_Indicador = ?");

            listaRetorno = consultar(query.toString(), criarParametros(indicador.getIdIndicador()));
        }
        
        return listaRetorno;
    }

    @Override
    protected DadoPrimarioVO extrairObjetoResultado(ResultSet rs) throws SQLException {

        DadoPrimarioVO entidade = new DadoPrimarioVO();
        
        entidade.setIdDadoPrimario(new Integer(rs.getInt("ID_DadoPrimario")));        
        entidade.setNoDadoPrimario(rs.getString("NO_DadoPrimario"));
        entidade.setDsDadoPrimario(rs.getString("DS_DadoPrimario"));
        entidade.setDsUnidadeMedidaDadoPrimario(rs.getString("DS_UnidadeMedidaDadoPrimario"));
        entidade.setCdModulo(new Integer(rs.getInt("CD_Modulo")));
        entidade.setCdIndicador(new Integer(rs.getInt("CD_Indicador")));

        return entidade;
    }

    @Override
    protected void mapearQueryParaExemplo(ConstrutorSQL query, DadoPrimarioVO exemplo) {

        if (exemplo.getNoDadoPrimario() != null && !exemplo.getNoDadoPrimario().isEmpty()) {
            query.append("AND T.NO_DadoPrimario LIKE ?");
            adicionarParametro("%" + exemplo.getNoDadoPrimario() + "%");
        }

        if (exemplo.getDsDadoPrimario() != null) {
            query.append("AND T.DS_DadoPrimario LIKE ?");
            adicionarParametro(exemplo.getDsDadoPrimario());
        }
        
        if (exemplo.getDsUnidadeMedidaDadoPrimario() != null) {
            query.append("AND T.DS_UnidadeMedidaDadoPrimario LIKE ?");
            adicionarParametro(exemplo.getDsUnidadeMedidaDadoPrimario());
        }

        if (exemplo.getCdModulo() != null) {
            query.append("AND T.CD_Modulo = ?");
            adicionarParametro(exemplo.getCdModulo());
        }
        
        if (exemplo.getCdIndicador() != null) {
            query.append("AND T.CD_Indicador = ?");
            adicionarParametro(exemplo.getCdIndicador());
        }
        
    }
}
